# **************************************
# --*-- coding: utf-8 --*--
# @Author  : white
# @FileName: 高次模型的回归.py
# @Time    : 2025-08-13
# **************************************
import matplotlib.pyplot as plt
import numpy as np
import statsmodels.api as sm
"""
高次元模型回归，将多个x次方变量理解为一个未知变量，将其作为一个特征量，
然后将其传入计算最小二乘法回归
"""

nsample = 100
# x 第一个变量
x = np.linspace(0, 10, nsample)
# x平方 第二个变量
X = np.column_stack((x, x ** 2))
# 添加常量特征列
X = sm.add_constant(X)
# 设置系数相关变量 y = β^0 + β^1*X + β^2*X^2
beta = np.array([1, 0.1, 10])
# 设置随机扰动，可以理解为将规律的坐标点进行随机分布
e = np.random.normal(size=nsample)
# 计算随机扰动的y坐标值
y = np.dot(X, beta) + e
model = sm.OLS(y, X)
results = model.fit()
print(results.params)  # [1.07051407 0.07451623 9.9996461 ]
print(results.summary())
y_fitted = results.fittedvalues
fig, ax = plt.subplots(figsize=(8, 6))
# 原始数据点用圆圈'o'表示，拟合的回归线用红色虚线点线'r--.'表示，
ax.plot(x, y, 'o', label='data')
ax.plot(x, y_fitted, 'r--.', label='OLS')
ax.legend(loc='best')
# ax.axis((-0.05, 2, -1, 25))
plt.show()
